From 505ef3ea86870bb8a35533ec9d446f98a6b61ea6 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Sat, 10 Mar 2007 16:58:11 +0000 Subject: [PATCH] Add flags field to VCPUOP_set_singlsehot_timer. Flag 'future' causes Xen to check if the timeout is in the past and return -ETIME if so. From: Jeremy Fitzhardinge Signed-off-by: Keir Fraser --- linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c | 1 + xen/common/domain.c | 4 ++++ xen/include/public/vcpu.h | 8 +++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c index 92971bcac6..a3ac4371a4 100644 --- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c +++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c @@ -1008,6 +1008,7 @@ static void stop_hz_timer(void) } singleshot.timeout_abs_ns = jiffies_to_st(j); + singleshot.flags = 0; rc = HYPERVISOR_vcpu_op(VCPUOP_set_singleshot_timer, cpu, &singleshot); #ifdef XEN_COMPAT_030004 if (rc) { diff --git a/xen/common/domain.c b/xen/common/domain.c index 7b4660fc91..57fb9ade71 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -623,6 +623,10 @@ long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) if ( copy_from_guest(&set, arg, 1) ) return -EFAULT; + if ( (set.flags & VCPU_SSHOTTMR_future) && + (set.timeout_abs_ns < NOW()) ) + return -ETIME; + if ( v->singleshot_timer.cpu != smp_processor_id() ) { stop_timer(&v->singleshot_timer); diff --git a/xen/include/public/vcpu.h b/xen/include/public/vcpu.h index 3d7d9587c0..7252d0b793 100644 --- a/xen/include/public/vcpu.h +++ b/xen/include/public/vcpu.h @@ -150,11 +150,17 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_set_periodic_timer_t); #define VCPUOP_set_singleshot_timer 8 /* arg == vcpu_set_singleshot_timer_t */ #define VCPUOP_stop_singleshot_timer 9 /* arg == NULL */ struct vcpu_set_singleshot_timer { - uint64_t timeout_abs_ns; + uint64_t timeout_abs_ns; /* Absolute system time value in nanoseconds. */ + uint32_t flags; /* VCPU_SSHOTTMR_??? */ }; typedef struct vcpu_set_singleshot_timer vcpu_set_singleshot_timer_t; DEFINE_XEN_GUEST_HANDLE(vcpu_set_singleshot_timer_t); +/* Flags to VCPUOP_set_singleshot_timer. */ + /* Require the timeout to be in the future (return -ETIME if it's passed). */ +#define _VCPU_SSHOTTMR_future (0) +#define VCPU_SSHOTTMR_future (1U << _VCPU_SSHOTTMR_future) + #endif /* __XEN_PUBLIC_VCPU_H__ */ /* -- 2.30.2